Journal d'un Terrien

Web log de Serge Boisse

On line depuis 1992 !

Publicité
Si cette page vous a plu, Copiez son adresse et partagez-la !
http://sboisse.free.fr/programmation/Algorithmes/Programmes en une seul line (One-liners).php
Savez-vous quels sont les articles les plus vendus sur Amazon.fr ?
Programmes en une seul line (One-liners)

Une incroyable liste de Programmes en une seule ligne

(one-liners ou unilignes)

Pasted image 20250306231015.png

Test si n est une puissance de 2 :
ispow2(n) = (n && !bitand(n,n-1)); avec bitand(a,b) = (a&b)
ou encore n && !(n&(n-1))
test si n est pair : even(n) = !(n&1)
https://www.quora.com/What-is-the-coolest-thing-you-can-do-with-one-line-of-code

Le programme suivant de Mike Keith calcule le jour de la semaine pour n'importe quelle année ou mois en une seule ligne de code C :

(d+=m<3?y--:y-2,23*m/9+d+4+y/4-y/100+y/400)%7
Par exemple y=1953, m=1, d=18 → Le résultat est zéro 0 (Dimanche)
the 18 of Janvier, 1853 était un dimanche. Amazing!

Le même avec gnuplot:
#0=dimanche, 1=lundi...6=samedi
day(d,m,y)=(23*m/9+d+y+((m<3)?4+(y-1)/4-(y-1)/100+(y-1)/400:2+y/4-y/100+y/400))%7

échange des variables x et y;
x=x^y; y=y^x; x=x^y (^ est le ou exclusif ou XOR)

Renverse une chaine récursivement :

function reverse(str) {
if ( str.length() <= 1)  { return str; // stopping case } 
 else { return reverse(str.substring(1)) + str.charAt(0); // recursion   } 

Bits hacks : manipulation des bits d'un nombre entier :

cf la vidéo https://www.youtube.com/watch?v=ZRNO-ewsNcQ&ab_channel=Creel
Rappel : ici le bit 0 est le bit le moins significatif, c'est à dire le bit de droite si les bit sont numérotés de droite à gauche (cas le plus courant)

  • force à '1' le n ième bit de : n = (1<<i)| n
  • force à '0' le n ième bit de :n = ~(1<<i) & n
  • inverse le n ième bit de : n = (1<<i) ^ n
  • Remplace les derniers bits '0' par '1' : n = (n-1)|n
  • remplace le bit "1" le plus à droite par un zéro : n = n&(n-1)
  • Inverse tous les bits : n = ~n ; noter que -n = (~n) +1 qui est le complement à 2
  • Renvoie le bit le moins significatif (bit 0) : n & -n&1
  • copie avec masque : copie les bits de B vers A qui sont à une position qui a un 1 dans le masque M :
    A=(B & M) | (A & ~M)
  • échange des bits aux index and dans n :
    p = (n>>a)^(n>>b) & 1 ; n ^= (p << a); n ^= (p<<b)
  • nb de bits à 1 (population count) : nbb1(n) = (n<=0)?0: 1+nbb1(n & (n-1))
  • code gray de n : gray(n) = (n^(n>>1))
  • code gray inverse (intégrale de parité):
    ig(x) = ig2(0,floor(x));ig2(r,n) = (n<=0) ? r: ig2(r^n, n/2)
  • nb d'îlots de 1 dans le nombre n en binaire : (n&1)+nbb1(gray(n))/2
  • bitscan forward (BSF): index of lowest bit set (starting at 0) : voir vidéo ci-dessus.
    check if two integers have opposite signs : res = (x ^ y) <0
  • nb de bits de n : nbb(n) = (n<=1)?1:1+nbb(n/2)
  • puissance de 2 immédiatement supérieure ou égale à n : 2**nbb(n-1) suppose n > 0
Voir aussi :

Publicité
Commentaires

Commentaires (0) :

Page :



Ajouter un commentaire (pas besoin de s'enregistrer)

Pseudo :
Message :


image de protection
En cliquant sur le bouton "Envoyer" vous acceptez les conditions suivantes : Ne pas poster de message injurieux, obscène ou contraire à la loi, ni de liens vers de tels sites. Respecter la "netiquette", ne pas usurper le pseudo d'une autre personne, respecter les posts faits par les autres. L'auteur du site se réserve le droit de supprimer un ou plusieurs posts à tout moment. Merci !
Ah oui : le bbcode et le html genre <br>, <a href=...>, <b>b etc. ne fonctionnent pas dans les commentaires. C'est voulu.
< Retour en haut de la page